package com.xinrui.sunnyday.serivce.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xinrui.sunnyday.dao.CheckGroupDao;
import com.xinrui.sunnyday.dao.SetMealDao;
import com.xinrui.sunnyday.dao.SetMealMobileDao;
import com.xinrui.sunnyday.entity.QueryPageBean;
import com.xinrui.sunnyday.pojo.CheckGroup;
import com.xinrui.sunnyday.pojo.Setmeal;
import com.xinrui.sunnyday.service.SetMealService;
import com.xinrui.sunnyday.utils.QiNiuUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = SetMealService.class)
@Transactional//事务开启
public class SetMealServiceImpl implements SetMealService {
    @Autowired
    private SetMealDao setMealDao;
    //    注入检查组
    @Autowired
    private CheckGroupDao checkGroupDao;
    //注入客户端套餐查询
    @Autowired
    private SetMealMobileDao setMealMobileDao;

    /**
     * 分页查询套餐
     *
     * @param queryPageBean
     * @return
     */
    @Override
    public PageInfo<Setmeal> findPage(QueryPageBean queryPageBean) {
//            1.打开分页
        PageHelper.startPage(queryPageBean.getCurrentPage(), queryPageBean.getPageSize());
//        2.判断是否进行模糊查询
        if (!StringUtils.isEmpty(queryPageBean.getQueryString())) {
//            拼接模糊查询sql语句
            queryPageBean.setQueryString("%" + queryPageBean.getQueryString() + "%");
        }
//        3.进行查询
        List<Setmeal> list = setMealDao.findPage(queryPageBean.getQueryString());
        return new PageInfo<>(list);
    }

    /**
     * 删除
     *
     * @param id
     */
    @Override
    public void deleteById(Integer id) {
//        先查询是否有检查组关联,如果有返回检查组的id
        Integer[] GroupId = setMealDao.findMealAndGroup(id);
//        判断，如果有循环遍历删除检查组
        if (null != GroupId && GroupId.length > 0) {
            for (Integer integer : GroupId) {
                //        1.将检查组和检查体检套餐的关联删除
                checkGroupDao.deleteSetMealAndCheckItemById(integer);
            }
        }
//        没有就直接删除套餐
        setMealDao.deleteById(id);
    }

    /**
     * 查询检查组
     *
     * @return
     */
    @Override
    public List<CheckGroup> findAllGroup() {
        return checkGroupDao.findAllGroup();
    }

    /**
     * 增加
     *
     * @param setmeal
     * @param checkgroupIds
     */
    @Override
    public void mealAndGroupAdd(Setmeal setmeal, Integer[] checkgroupIds) {
//        1.先增加套餐
        setMealDao.addSetMeal(setmeal);
//        增加套餐后返回的id
        Integer id = setmeal.getId();
//        2.判断是否有添加检查组
        if (null != checkgroupIds && checkgroupIds.length > 0) {
//            使用map集合封装
            Map<String, Object> map = new HashMap<>();
            map.put("mealId", id);
            map.put("groupId", checkgroupIds);
            setMealDao.addMealAndGroup(map);
        }
//        新增后生成静态页面
//        调用方法
        generateMobileStaticHtml();
    }

    //    生成套餐详情，套餐列表页面
    private void generateMobileStaticHtml() {
        try {
//        1.套餐列表
            generateSetMealListHtml();
//        2.套餐详情
            generateSetmealDetailHtml();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    //    套餐列表
    private void generateSetMealListHtml() {
//        准备模板文件路径，freemarker配置文件中已经配置好了路径前缀
        String templateName = "mobile_setmeal.ftl";
//        准备套餐列表页面的数据
        List<Setmeal> mealMobile = setMealMobileDao.findAllMealMobile();
//        遍历拼接图片返回
        mealMobile.forEach(s -> {
            s.setImg(QiNiuUtils.DOMAIN + s.getImg());
        });
//        构建数据
        HashMap<String, Object> map = new HashMap<>();
        map.put("setmealList", mealMobile);
//        输出全路径
        String setMealListFile = out_put_path + "mobile_setmeal.html";
//        调用方法生成页面
        generateHtml(templateName, map, setMealListFile);
    }

    //    套餐详情
    private void generateSetmealDetailHtml() {
//        模板文件路径
        String templateName = "mobile_setmeal_detail.ftl";
//        准备套餐详情列表页面的数据
//        1.先将所有套餐查询出来
        List<Setmeal> allMealMobile = setMealMobileDao.findAllMealMobile();
//        2.遍历
        for (Setmeal setmeal : allMealMobile) {
//            拿到所有套餐的id,
            Integer id = setmeal.getId();
//            根据id查询套餐详情
            Setmeal detailById = setMealMobileDao.findDetailById(id);
//            拼接图片路径
            detailById.setImg(QiNiuUtils.DOMAIN +detailById.getImg());
//            构建数据
            HashMap<String, Object> map = new HashMap<>();
            map.put("setmeal",detailById);
            //        输出全路径
            String setMealListFile=out_put_path+"mobile_setmeal_"+detailById.getId()+".html";
            //        调用方法生成页面
            generateHtml(templateName,map,setMealListFile);
        }
    }

    @Override
    public Setmeal findById(Integer id) {
        return setMealDao.findById(id);
    }

    /**
     * 查询当前套餐的检查组
     *
     * @param id
     * @return
     */
    @Override
    public Integer[] findByIdGroup(Integer id) {
        Integer[] integers = setMealDao.findByIdGroup(id);
        return integers;
    }

    /**
     * 修改
     *
     * @param setmeal
     * @param checkgroupIds
     */
    @Override
    public void update(Setmeal setmeal, Integer[] checkgroupIds) {
//                1.修改套餐
        setMealDao.update(setmeal);
//        套餐的id
        Integer id = setmeal.getId();
//        2.如果用户修改了套餐的检查组
        if (null != checkgroupIds && checkgroupIds.length > 0) {
//                先删除所有与检查组的关联
            setMealDao.deleteMealAndGroup(id);
//            3.再进行批量添加
            // 使用map集合封装
            Map<String, Object> map = new HashMap<>();
            map.put("mealId", id);
            map.put("groupId", checkgroupIds);
            setMealDao.addMealAndGroup(map);
        }
    }

    /**
     * 查询数据库中的所有图片
     *
     * @return
     */
    @Override
    public List<String> findImg() {
        return setMealDao.findImg();
    }

    /**
     * Freemarker工具类封装，因为common没有spring容器不能进行注入，所以在这里封装一个方法
     */
//    注入一个Freemarker配置类
    @Autowired
    private FreeMarkerConfig freeMarkerConfig;
    //    引入Freemarker配置类中的输出路径
//    @Value("${out_put_path}")
    private String out_put_path="D:/IdeaProjects/sunnyday/sunnyday-mobile/src/main/webapp/pages/";

    /**
     * 封装生成静态页面方法
     */
    private void generateHtml(String templateName, Map<String, Object> dataMap, String outFileName) {
//    获取配置类
        Configuration configuration = freeMarkerConfig.getConfiguration();
        BufferedWriter bufferedWriter = null;
        try {
            //    加载模板文件
            Template template = configuration.getTemplate(templateName);
            //    构建数据
            //    输出文件路径
            bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFileName), "utf-8"));
            //将数据填充到模板
            template.process(dataMap, bufferedWriter);
            //    刷新
            bufferedWriter.flush();
        } catch (IOException | TemplateException e) {
//            关闭流
            try {
                bufferedWriter.close();
            } catch (IOException ioException) {
                e.printStackTrace();
            }
        }
    }

}
